package com.seu.me.thread.day1.sync007;

/**
 * @Desc: 原子操作与volatile类
 * @Author: liangfeihu
 * @Date: Created in 2017/11/19 11:39
 */
public class RunThread extends Thread {
    /**
     * volatile是告诉编译器,每次取这个变量的值都需要从主存中取,而不是用自己线程工作内存中的缓存.
     * static 是说这个变量,在主存中所有此类的实例用的是同一份,各个线程创建时需要从主存同一个位置
     * 拷贝到自己工作内存中去(而不是拷贝此类不同实例中的这个变量的值),也就是说只能保证线程创建时,
     * 变量的值是相同来源的,运行时还是使用各自工作内存中的值,依然会有不同步的问题.
     */
    private volatile boolean isRunning = true;
    // private boolean isRunning = true;

    private void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 进入run方法..");
        int i = 0;
        while (isRunning) {
            //..
        }
        System.out.println(Thread.currentThread().getName() + " 线程停止");
    }

    public static void main(String[] args) throws InterruptedException {
        RunThread rt = new RunThread();
        rt.start();
        Thread.sleep(5000);
        rt.setRunning(false);
        System.out.println(Thread.currentThread().getName() + " isRunning的值已经被设置了false");
    }


}
